x11: add missing checks that a hint is supported
authorGeoff Reedy <geoff@programmer-monk.net>
Thu, 10 Jan 2013 04:40:04 +0000 (21:40 -0700)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 12 Jan 2013 23:38:37 +0000 (18:38 -0500)
Before acting on any hint that is set by the window manager we must
first check that the hint is supported by the current window manager.
Checking that a property has a value is insufficient as it may have
been set by a previous window manager which did support the hint.

https://bugzilla.gnome.org/show_bug.cgi?id=691515

gdk/x11/gdkscreen-x11.c
gdk/x11/gdkwindow-x11.c

index a6d8ba6582d0167e63f7a19c34b69bc2a35a5205..b5767b58f41bc3ae0047e970a10a7ab987d274a6 100644 (file)
@@ -280,6 +280,10 @@ get_current_desktop (GdkScreen *screen)
   unsigned char *data_return = NULL;
   int workspace = 0;
 
+  if (!gdk_x11_screen_supports_net_wm_hint (screen,
+                                            gdk_atom_intern_static_string ("_NET_CURRENT_DESKTOP")))
+    return workspace;
+
   display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
   win = XRootWindow (display, GDK_SCREEN_XNUMBER (screen));
 
@@ -330,6 +334,10 @@ get_work_area (GdkScreen    *screen,
   area->width = gdk_screen_get_width (screen);
   area->height = gdk_screen_get_height (screen);
 
+  if (!gdk_x11_screen_supports_net_wm_hint (screen,
+                                            gdk_atom_intern_static_string ("_NET_WORKAREA")))
+    return;
+
   if (workarea == None)
     return;
 
index 150f58e0039c6464b983d82044dd4812abf9de9a..70a6ba030346f25e7fc6ea1f84630b787ca07dea 100644 (file)
@@ -1738,7 +1738,9 @@ static void
 move_to_current_desktop (GdkWindow *window)
 {
   if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
-                                          gdk_atom_intern_static_string ("_NET_WM_DESKTOP")))
+                                          gdk_atom_intern_static_string ("_NET_WM_DESKTOP")) &&
+      gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
+                                          gdk_atom_intern_static_string ("_NET_CURRENT_DESKTOP")))
     {
       Atom type;
       gint format;
@@ -2717,7 +2719,9 @@ gdk_x11_window_get_frame_extents (GdkWindow    *window,
   xwindow = GDK_WINDOW_XID (window);
 
   /* first try: use _NET_FRAME_EXTENTS */
-  if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), xwindow,
+  if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
+                                           gdk_atom_intern_static_string ("_NET_FRAME_EXTENTS")) &&
+      XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), xwindow,
                           gdk_x11_get_xatom_by_name_for_display (display,
                                                                   "_NET_FRAME_EXTENTS"),
                           0, G_MAXLONG, False, XA_CARDINAL, &type_return,
@@ -2764,7 +2768,9 @@ gdk_x11_window_get_frame_extents (GdkWindow    *window,
   /* use NETWM_VIRTUAL_ROOTS if available */
   root = GDK_WINDOW_XROOTWIN (window);
 
-  if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), root,
+  if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
+                                           gdk_atom_intern_static_string ("_NET_VIRTUAL_ROOTS")) &&
+      XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), root,
                          gdk_x11_get_xatom_by_name_for_display (display, 
                                                                 "_NET_VIRTUAL_ROOTS"),
                          0, G_MAXLONG, False, XA_WINDOW, &type_return,